#!/usr/bin/env node

/**
 * 本地打包脚本
 * 创建可安装的 .tgz 文件
 */

import { execSync } from 'child_process';
import fs from 'fs';
import path from 'path';

const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8'));

console.log('📦 ContentFlow Shared Library 本地打包\n');

function runCommand(command, description) {
  console.log(`📋 ${description}`);
  console.log(`💻 执行: ${command}`);
  
  try {
    const output = execSync(command, { 
      encoding: 'utf8',
      stdio: 'pipe'
    });
    
    console.log(`✅ 完成`);
    return output.trim();
  } catch (error) {
    console.log(`❌ 错误: ${error.message}`);
    return null;
  }
}

async function createLocalPackage() {
  console.log(`📦 包名: ${packageJson.name}`);
  console.log(`📌 版本: ${packageJson.version}\n`);

  // 1. 检查构建文件
  console.log('1️⃣ 检查构建文件');
  const buildFiles = [
    'dist/esm/index.js',
    'dist/cjs/index.cjs',
    'dist/types/index.d.ts'
  ];

  let needsBuild = false;
  for (const file of buildFiles) {
    if (!fs.existsSync(file)) {
      console.log(`❌ 缺少构建文件: ${file}`);
      needsBuild = true;
    } else {
      console.log(`✅ 构建文件存在: ${file}`);
    }
  }

  // 2. 构建项目（如果需要）
  if (needsBuild) {
    console.log('\n2️⃣ 构建项目');
    const buildOutput = runCommand('npm run build', '构建项目');
    if (!buildOutput) {
      console.log('\n❌ 构建失败，请检查错误信息');
      process.exit(1);
    }
  } else {
    console.log('\n2️⃣ 构建文件已存在，跳过构建');
  }

  // 3. 运行发布前检查
  console.log('\n3️⃣ 运行发布前检查');
  const checkOutput = runCommand('node scripts/publish-check.js', '发布前检查');
  if (!checkOutput) {
    console.log('\n❌ 发布前检查失败');
    process.exit(1);
  }

  // 4. 创建包
  console.log('\n4️⃣ 创建本地包');
  const packOutput = runCommand('npm pack', '打包项目');
  
  if (packOutput) {
    // 查找生成的 .tgz 文件
    const files = fs.readdirSync('.');
    const tgzFile = files.find(file => file.endsWith('.tgz') && file.includes('contentflow-shared'));
    
    if (tgzFile) {
      const stats = fs.statSync(tgzFile);
      const sizeKB = (stats.size / 1024).toFixed(1);
      
      console.log('\n🎉 本地包创建完成！');
      console.log(`📄 文件: ${tgzFile}`);
      console.log(`📊 大小: ${sizeKB} KB`);
      
      console.log('\n📋 在其他项目中安装此包：');
      console.log(`   npm install ${path.resolve(tgzFile)}`);
      console.log(`   # 或使用相对路径`);
      console.log(`   npm install ../contentflow-shared/${tgzFile}`);
      
      console.log('\n📋 在 package.json 中直接引用：');
      console.log(`   {`);
      console.log(`     "dependencies": {`);
      console.log(`       "${packageJson.name}": "file:./${tgzFile}"`);
      console.log(`     }`);
      console.log(`   }`);
      
      console.log('\n📋 在代码中导入：');
      console.log(`   import { StorageAdapterFactory } from '${packageJson.name}';`);
      console.log(`   import { createPlatformHandler } from '${packageJson.name}/platforms';`);
      
      console.log('\n💡 提示：');
      console.log('   - 每次修改代码后需要重新运行此脚本');
      console.log('   - 可以将 .tgz 文件分享给团队成员使用');
      console.log('   - 这种方式适合测试发布前的最终版本');
      
      // 创建安装说明文件
      const installInstructions = `# 安装 ContentFlow Shared Library

## 方法 1: 直接安装
\`\`\`bash
npm install ${path.resolve(tgzFile)}
\`\`\`

## 方法 2: 在 package.json 中添加依赖
\`\`\`json
{
  "dependencies": {
    "${packageJson.name}": "file:./${tgzFile}"
  }
}
\`\`\`

然后运行：
\`\`\`bash
npm install
\`\`\`

## 使用示例
\`\`\`typescript
import { StorageAdapterFactory } from '${packageJson.name}';
import { createPlatformHandler } from '${packageJson.name}/platforms';

const factory = new StorageAdapterFactory();
console.log('支持的存储类型:', factory.getSupportedTypes());
\`\`\`

---
生成时间: ${new Date().toLocaleString()}
包版本: ${packageJson.version}
`;
      
      fs.writeFileSync('INSTALL_LOCAL.md', installInstructions);
      console.log(`📄 已创建安装说明: INSTALL_LOCAL.md`);
      
    } else {
      console.log('\n❌ 未找到生成的 .tgz 文件');
    }
  } else {
    console.log('\n❌ 打包失败');
    process.exit(1);
  }
}

// 检查是否在正确的目录
if (!fs.existsSync('package.json')) {
  console.log('❌ 请在项目根目录运行此脚本');
  process.exit(1);
}

if (packageJson.name !== '@contentflow/shared') {
  console.log('❌ 此脚本只能在 ContentFlow Shared Library 项目中运行');
  process.exit(1);
}

createLocalPackage().catch(console.error);
